package classreflex;

import java.lang.reflect.Field;

/**
 *
 * 利用Calss类的实例（反射）操作运行时类的变量（属性）
 * @author 15594
 */
public class VariableTest {
    public static void main(String[] args) throws Exception {
        Class<?> personClass = Class.forName("classreflex.Person");
        Person person = (Person) personClass.newInstance();

        System.out.println("获取操作变量的对象：方式一：");

        //根据name获取操作属性的对象,注意：getField()只能获取pubic类型的变量
        Field show = personClass.getField("show");
        //给指定的对象设置属性值，如果这个属性值为静态的那么为 第一个参数null
        show.set(person,"hello");

        //获取指定对象属性的值
        //方式一：
        String str = (String)show.get(person);
        System.out.println(str);
        //方式二：
        System.out.println(person.getShow());

        System.out.println("获取操作变量的对象：方式二：（常用）");

        //获取运行时类的所有变量的操作对象
        Field age = personClass.getDeclaredField("age");
        //注意这里的age属性是私有的，需要设置是否可访问。true可以对私有属性进行修改
        age.setAccessible(true);
        age.set(person,18);
        System.out.println(person);

        //设置静态变量的值
        Field firstName = personClass.getDeclaredField("firstName");
        firstName.set(null,"李");
        System.out.println(firstName.get(null));
        System.out.println(person);

    }

}

